/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.serviportales.serviquality.managers;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.rits.cloning.Cloner;
import com.serviportales.serviportales.model.GenericTreeModel;
import com.serviportales.serviportales.utils.BeansUtils;
import com.serviportales.serviquality.dao.CalProyectoNodoDAO;
import com.serviportales.serviquality.dao.ProyectoNodoDAO;
import com.serviportales.serviquality.dao.ProyectoUserDAO;
import com.serviportales.serviquality.exception.ServiqualityException;
import com.serviportales.serviquality.model.CalProyectoNodo;
import com.serviportales.serviquality.model.ProyectoNodo;
import com.serviportales.serviquality.model.ProyectoUser;

@Service
@Transactional(rollbackFor = { ServiqualityException.class })
public class MgrCalProyectoNodo {

	@Autowired
	private CalProyectoNodoDAO calProyectoNodoDAO;

	@Autowired
	private ProyectoNodoDAO proyectoNodoDAO;

	@Autowired
	private ProyectoUserDAO proyectoUserDAO;

	@Autowired
	private MessageSource messageSource;

	public void grabarCalProyectoNodo(CalProyectoNodo calProyectoNodoParam) throws ServiqualityException {
		try {
			if(calProyectoNodoParam.getCalificacion()==null){
				throw new ServiqualityException("calProyectoNodo.calificacion.null");
			}

			CalProyectoNodo calProyectoNodo = new Cloner().deepClone(calProyectoNodoParam);
			CalProyectoNodo calProyectoNodoBD = calProyectoNodoDAO.selectByUnique(calProyectoNodo);
			if (calProyectoNodoBD != null) {
				calProyectoNodoBD.setCalificacion(calProyectoNodo.getCalificacion());
				calProyectoNodoBD.setConclusion(calProyectoNodo.getConclusion());
				calProyectoNodoDAO.update(calProyectoNodoBD);
			} else {
				calProyectoNodo.setProyectoNodo(proyectoNodoDAO.selectByID(calProyectoNodo.getProyectoNodo().getProyectoNodoPK()));
				calProyectoNodo.setProyectoUser(proyectoUserDAO.selectByID(calProyectoNodo.getProyectoUser().getProyectoUserPK()));
				calProyectoNodoDAO.insert(calProyectoNodo);
				calProyectoNodoDAO.getHibernateTemplate().flush();
			}
		} catch (ServiqualityException e) {
			throw e;
		} catch (Exception exception) {
			throw new ServiqualityException(messageSource.getMessage(ServiqualityException.GRABAR_ERROR, new String[] { exception.getMessage() }, LocaleContextHolder.getLocale()), exception);
		}
	}

	public GenericTreeModel<CalProyectoNodo> createTree(ProyectoUser proyectoUser) throws ServiqualityException {
		try {
			GenericTreeModel<CalProyectoNodo> tree = new GenericTreeModel<CalProyectoNodo>();
			CalProyectoNodo calProyectoNodoRoot = new CalProyectoNodo();
			calProyectoNodoRoot.setProyectoNodo(new ProyectoNodo());
			calProyectoNodoRoot.getProyectoNodo().getProyectoNodoPK().setProyecto(proyectoUser.getProyectoUserPK().getProyecto());
			calProyectoNodoRoot.setProyectoUser(proyectoUser);
			tree.setRootNode(calProyectoNodoRoot.getProyectoNodo().getProyectoNodoPK().getProyecto().getNombre(), calProyectoNodoRoot);

			List<CalProyectoNodo> calProyectoNodos = calProyectoNodoDAO.selectCreateTree(proyectoUser);
			List<ProyectoNodo> proyectoNodos = proyectoNodoDAO.selectCreateTree(proyectoUser.getProyectoUserPK().getProyecto());

			List<CalProyectoNodo> nodos = new ArrayList<CalProyectoNodo>();
			for (ProyectoNodo proyectoNodo : proyectoNodos) {
				boolean isInCalProyectoNodos = false;
				for (CalProyectoNodo calProyectoNodo : calProyectoNodos) {
					if (BeansUtils.compareBeanByPK(calProyectoNodo.getProyectoNodo(), proyectoNodo)) {
						nodos.add(calProyectoNodo);
						isInCalProyectoNodos = true;
						break;
					}
				}
				if (!isInCalProyectoNodos) {
					CalProyectoNodo calProyectoNodo = new CalProyectoNodo();
					calProyectoNodo.setProyectoUser(proyectoUser);
					calProyectoNodo.setProyectoNodo(proyectoNodo);
					nodos.add(calProyectoNodo);
				}
			}

			for (CalProyectoNodo calProyectoNodo : nodos) {
				CalProyectoNodo calProyectoNodoParent = null;
				if (calProyectoNodo.getProyectoNodo().getParent() != null) {
					for (CalProyectoNodo calProyectoNodoP : nodos) {
						if (BeansUtils.compareBeanByPK(calProyectoNodoP.getProyectoNodo(), calProyectoNodo.getProyectoNodo().getParent())) {
							calProyectoNodoParent = calProyectoNodoP;
							break;
						}
					}
				}
				tree.addNode(calProyectoNodoParent, calProyectoNodo.getProyectoNodo().getProyectoNodoPK().getNodo().getNombre(), calProyectoNodo);
			}

			tree.finishConfig();
			return tree;
		} catch (Exception exception) {
			throw new ServiqualityException(messageSource.getMessage(ServiqualityException.BUSCAR_ERROR, new String[] { exception.getMessage() }, LocaleContextHolder.getLocale()), exception);
		}
	}
}
